/**
 * Desc: 双队列容器。实现读写分离。
 * Auth: 张宇飞
 * Date: 2017-05-11
 */

#include <functional>
#include <deque>

template <typename T>
class ZDoubleQueue {
public:
    ZDoubleQueue() : _widx(0) , _ridx(1) { }

    ~ZDoubleQueue() { }

    typedef std::function<void(T)> ForeachFunc;

public:
    // 向写队列添加读
    void push(T e) {
        _queue[_widx].push_back(e);
    }

    // 从读队列获得读
    T pop() {
        return _queue[_ridx].pop_front();
    }

    // 清空读队列
    void clean() {
        _queue[_ridx].clear();
    }

    // 获取读队列的大小
    std::size_t size(bool writter = false) {
        return _queue[writter ? _widx : _ridx].size();
    }

    void swap() {
        _widx ^= 1;
        _ridx ^= 1;
    }

    // 遍历读队列
    void foreach(const ForeachFunc& callback) {
        if (!callback) {
            return;
        }
        for (auto e: _queue[_ridx]) {
            callback(e);
        }
    }

private:
    std::deque<T> _queue[2];
    int _widx;
    int _ridx;
};
